package com.spring.theory.aop.cglibProxy;

import java.lang.reflect.Method;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

/**
 * TestCglibProxy
 *
 * @author H
 * @version 1.0
 * @date 2024-01-03 14:49
 */
@Slf4j
public class TestCglibProxy {

    public static void main(String[] args) {
        //待增强类
        CglibTarget target = new CglibTarget();
        CglibProxy proxy = new CglibProxy(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                log.info("cglib proxy before...");
                //反射调用
                //return method.invoke(target, args);
                /**
                 * 内部无反射，结合目标调用;底层是通过 对象.方法 调用,自然就避免了反射调用
                 * 创建两个fastClass类，利用方法签名下标，寻找到指定方法。进行 对象.方法 调用
                 */
                return methodProxy.invoke(target, args);
                // todo cglib为什么默认使用 invoke 而不是 invokeSuper 方法
                /**
                 * 内部无反射，结合代理调用；实际上就是由代理类去调用父类的指定方法（调用原始功能）
                 */
                //return methodProxy.invokeSuper(o, args);
            }
        });
        proxy.test();
        int test = proxy.test(1);
        log.info("{}", test);
        proxy.test(2L);

    }

}
